package RMI;

import Controlador.CPrincipal;
import Modelo.Cliente;
import Modelo.ICliente;
import Modelo.IMensaje;
import Modelo.IServidor;
import java.net.MalformedURLException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.logging.Level;
import java.util.logging.Level;
import java.util.logging.Logger;

public class CRMI {

    static Registry registro;
    static int RMIPort;
    static String hostName;


    public static Registry iniciarRegistro(int p) throws NotBoundException, MalformedURLException, RemoteException {

        String portNum;

        try {
            portNum = ConfigurationParametersManager.getParameter("DataSource/portNum");
            int RMIPortNum = Integer.parseInt(portNum);
            registro = startRegistry(p);
            System.out.println("registro ok");
            return registro;

        } catch (MissingConfigurationParameterException ex) {
            Logger.getLogger(CRMI.class.getName()).log(Level.SEVERE, null, ex);
        }

        return registro;
    }
    private static Registry startRegistry(int RMIPortNum) throws RemoteException {
        try {
            // crear el registro y ligar el nombre y objeto.
            registro = LocateRegistry.getRegistry(RMIPortNum);
            // Lanza una excepción si no existe el registro
            registro.list();
        } catch (RemoteException e) {
            // No hay un registro válido en el puerto.
            registro = LocateRegistry.createRegistry(RMIPortNum);
            registro.list();
        }
        return registro;
    }
    
    public static IMensaje getMensaje(IMensaje c)  throws MissingConfigurationParameterException,
            NotBoundException,MalformedURLException, RemoteException {

        System.out.println("RMICliente: getMensaje");
        java.security.AllPermission a = new java.security.AllPermission();
        System.setProperty("java.security.policy", "rmi.policy");
        hostName = ServidorManager.getParameter("servidor");
        RMIPort = Integer.parseInt(ServidorManager.getParameter("portNum"));
        registro = LocateRegistry.getRegistry(hostName, RMIPort);
        c = (IMensaje) registro.lookup("mensaje");

        return c;
    }

    public static IServidor getServidor(IServidor c)  throws MissingConfigurationParameterException,
            NotBoundException,MalformedURLException, RemoteException {

        System.out.println("RMICliente: getServidor");
        java.security.AllPermission a = new java.security.AllPermission();
        System.setProperty("java.security.policy", "rmi.policy");
        hostName = ServidorManager.getParameter("servidor");
        RMIPort = Integer.parseInt(ServidorManager.getParameter("portNum"));
        registro = LocateRegistry.getRegistry(hostName, RMIPort);
        c = (IServidor) registro.lookup("Servidor");

        return c;
    }

    public static void setCliente(Registry registro, IServidor c, CPrincipal cp) throws NotBoundException, MalformedURLException, RemoteException {
        ICliente cliente = (ICliente) new Cliente(c, cp);
        System.out.println("setCliente");
        registro.rebind("Cliente", cliente);
    }
}